/**********************************************************************************
 * 文件名称：
 * 功能说明：
 * 作者：laud（qq：554163925）
 * 修改记录
 *
**********************************************************************************/
#include "gsm.h"
#include "gsm_flow.h"

typedef struct 
{
  /* 当前模式 */
  uint8_t cur_mode;

  /* 流控制处理句柄 */
  mdm_fcmCtrlHdlr_f handler;
} MDM_FlowCfgTypedef;

static MDM_FlowCfgTypedef mdm_fcm = { MDM_FCM_V24_STATE_AT, NULL };

/* 启动流控服务 */
extern void MDM_FlowServiceStart ( mdm_fcmCtrlHdlr_f CtrlHandler )
{
    if ( CtrlHandler )
    {
        /* 配置状态与控制处理器 */
        mdm_fcm.cur_mode = MDM_FCM_V24_STATE_AT;
        mdm_fcm.handler = CtrlHandler;

        /* 流控制打开 */
        if ( mdm_fcm.handler )
        {
            mdm_fcm.handler ( MDM_FCM_EVENT_FLOW_OPENNED );
        }
    } 
}

/* 流状态切换 */
extern void MDM_FlowSwitchV24State ( uint8_t State )
{
    /* 状态转换 */
    switch ( State )
    {
        /* AT状态 */
        case MDM_FCM_V24_STATE_AT:
            mdm_fcm.cur_mode = MDM_FCM_V24_STATE_AT;
            if ( mdm_fcm.handler )
            {
                mdm_fcm.handler ( MDM_FCM_EVENT_V24_AT_MODE );
            }
        break;

        /* 数据状态 */
        case MDM_FCM_V24_STATE_DATA:
            mdm_fcm.cur_mode = MDM_FCM_V24_STATE_DATA;
            if ( mdm_fcm.handler )
            {
                mdm_fcm.handler ( MDM_FCM_EVENT_V24_DATA_MODE );
            }
        break;

        /* 切换状态 */
        case MDM_FCM_V24_STATE_SW:
        if ( mdm_fcm.cur_mode == MDM_FCM_V24_STATE_DATA )
        {
            mdm_fcm.cur_mode = MDM_FCM_V24_STATE_SW;
            if ( mdm_fcm.handler )
            {
                /* ->指令状态 */
                mdm_fcm.handler ( MDM_FCM_EVENT_V24_AT_MODE_FROM_CALL );
            }      
        }
        else 
            if ( mdm_fcm.cur_mode == MDM_FCM_V24_STATE_AT )
            {
                mdm_fcm.cur_mode = MDM_FCM_V24_STATE_SW;
                if ( mdm_fcm.handler )
                {
                /* ->数据状态 */
                mdm_fcm.handler ( MDM_FCM_EVENT_V24_DATA_MODE_FROM_CALL );
                }      
            }
        break;
    }
}

extern uint8_t MDM_QueryFlowStatus ( void )
{
    return mdm_fcm.cur_mode;
}

